#include "caso.h"

Caso::Caso(Sentencia *next, Variable *variable, CasoList *casolist, Sentencia *instrucciones, int fila, int col):Sentencia(next,fila,col)
{
    this->variable=variable;
    this->casolist=casolist;
    this->instrucciones=instrucciones;
}

string Caso::is()
{
    return "CASO";
}

Variable *Caso::getVariable()
{
    return this->variable;
}

CasoList *Caso::getCasoList()
{
    return this->casolist;
}

Sentencia *Caso::getInstrucciones()
{
    return this->instrucciones;
}

void Caso::setVariable(Variable *variable)
{
    this->variable=variable;
}

void Caso::setCasoList(CasoList *casolist)
{
    this->casolist = casolist;
}

void Caso::setInstrucciones(Sentencia *instrucciones)
{
    this->instrucciones = instrucciones;
}

Tipo_ts *Caso::validarSemantica(Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    Tipo_ts *tts = this->variable->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    if(this->casolist!=0){
        this->casolist->setVariable(tts);
        this->casolist->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    if(this->instrucciones!=0){
        this->instrucciones->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    if(this->getNext()!=0){
        this->getNext()->SetReturn(this->GetReturn());
        this->getNext()->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    return 0;
}

string Caso::generarCodigo(GenerarVariable *var, Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    string codigo = "switch("+this->getVariable()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible).codigo+") {\n";
    codigo += this->getCasoList()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);

    if(this->getInstrucciones()!=0){
         codigo += "defalut: \n";
        codigo += this->getInstrucciones()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
        codigo += "\nbreak;";
    }
    codigo += "}\n";
    if(this->getNext()!=0){
        codigo += this->getNext()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
    }

    return codigo;

}
